package routes

import (
	"context"
	"encoding/json"
	"fmt"
	"os/exec"
	"runtime"
	"strings"
	. "wails/modules/editor/configs"
	"wails/modules/editor/models"
	"wails/modules/editor/services"

	"gitee.com/zhongguo168a/gocodes/gox/osx/filex"
	"gitee.com/zhongguo168a/gocodes/gox/pathx/filepathx"
	"gitee.com/zhongguo168a/gocodes/myx/errorx"
)

func (this *Http) C查找文件夹(ctx context.Context, args *C查找文件夹, result *C查找文件夹响应) error {
	//{Path: "dir1", Size: "1024", ModTime: Date.now(), IsDir: true},
	//{Path: "dir1/sub1", Size: "1024", ModTime: Date.now(), IsDir: true},
	//{Path: "dir1/sub1/file1.json", Size: "1024", ModTime: Date.now(), IsDir: false},
	//{Path: "dir2", Size: "1024", ModTime: Date.now(), IsDir: true},
	files := filex.NewFilter().
		GetFileInfosByPath(models.Module.Get配置路径())

	var list []map[string]interface{}
	for _, info := range files {
		if info.Path() == models.Module.Get配置路径() {
			continue
		}
		list = append(list, map[string]interface{}{
			"Path": func() (x string) {
				path := info.Path()
				path = strings.Replace(path, models.Module.Get配置路径()+"/", "", 1)
				return path
			}(), "Size": info.Size(), "ModTime": info.ModTime(), "IsDir": info.IsDir(),
		})
	}

	b, _ := json.Marshal(list)
	result.S数据 = string(b)
	return nil
}

func (this *Http) Get导航目录(ctx context.Context, args *Get导航目录参数, result *Get导航目录响应) error {
	if args.L路径 == "" {
		return errorx.New("参数错误")
	}
	//{Path: "dir1", Size: "1024", ModTime: Date.now(), IsDir: true},
	//{Path: "dir1/sub1", Size: "1024", ModTime: Date.now(), IsDir: true},
	//{Path: "dir1/sub1/file1.json", Size: "1024", ModTime: Date.now(), IsDir: false},
	//{Path: "dir2", Size: "1024", ModTime: Date.now(), IsDir: true},
	读取路径 := models.Module.Get编辑器路径()

	fileFilter := filex.NewFilter()
	fileFilter.Depth(1)
	files := fileFilter.GetFileInfosByPath(读取路径 + "/" + args.L路径)
	var list []string
	for _, info := range files {
		if info.Path() == 读取路径+"/"+args.L路径 {
			continue
		}
		if !info.IsDir() {
			continue
		}
		list = append(list, func() (x string) {
			path := info.Path()
			path = strings.Replace(path, 读取路径+"/", "", -1)
			return path
		}())
	}
	result.S数据 = list
	return nil
}

func (this *Http) L列表文件(ctx context.Context, args *L列表文件参数, result *L列表文件响应) error {
	if args.L路径 == "" {
		return errorx.New("参数非法")
	}
	//{Path: "dir1", Size: "1024", ModTime: Date.now(), IsDir: true},
	//{Path: "dir1/sub1", Size: "1024", ModTime: Date.now(), IsDir: true},
	//{Path: "dir1/sub1/file1.json", Size: "1024", ModTime: Date.now(), IsDir: false},
	//{Path: "dir2", Size: "1024", ModTime: Date.now(), IsDir: true},
	读取路径 := models.Module.Get编辑器路径() + "/" + args.L路径

	fileFilter := filex.NewFilter()
	fileFilter.IncludeSuffix(".ycj")
	fileFilter.IncludeSuffix(".map")
	files := fileFilter.GetFileInfosByPath(读取路径)

	var list []*W文件项
	for _, info := range files {
		if info.Path() == 读取路径 {
			continue
		}
		list = append(list, &W文件项{
			L路径: func() (x string) {
				path := info.Path()
				path = strings.Replace(path, models.Module.Get编辑器路径()+"/", "", 1)
				return path
			}(), R容量: int(info.Size()), X修改时间: int(info.ModTime().Unix()), S是目录: info.IsDir(),
		})
	}

	result.S数据 = list
	return nil
}

func (this *Http) D读取配置(ctx context.Context, args *D读取配置, result *D读取配置响应) (err error) {
	result.S数据, err = sr.File.GetFileConfigAll()
	return
}

func (this *Http) C重置被修改的配置(ctx context.Context, args *C重置被修改的配置, result *C重置被修改的配置响应) (err error) {
	var W文件列表 = []string{}
	errUnmarshal := json.Unmarshal([]byte(args.W文件列表), &W文件列表)
	if errUnmarshal != nil {
		return errorx.New("json.Unmarshal")
	}
	if len(W文件列表) == 0 {
		return errorx.New("无重置的文件")
	}
	filter := filex.NewFilter()
	for _, filePath := range W文件列表 {
		filter.IncludeFile(models.Module.H获取文件路径("config/" + filePath))
	}
	files := filter.GetFileInfosByPath(models.Module.H获取文件路径("config"))

	set, errs := sr.File.GetFileConfig(files)
	_ = errs

	b, _ := json.Marshal(set)
	result.S数据 = string(b)
	return
}

func (this *Http) D读取场景配置(ctx context.Context, args *D读取场景配置, result *D读取场景配置响应) (err error) {
	result.S数据, err = sr.File.GetFileConfig场景(args.C场景路径)
	return
}

func (this *Http) X新建文件夹(ctx context.Context, args *X新建文件夹, result *X新建文件夹响应) (err error) {
	result.X新文件路径, err = sr.File.NewFolder(args.W文件路径)
	return
}

func (this *Http) X新建文件(ctx context.Context, args *X新建文件, result *X新建文件响应) (err error) {
	文件内容字典 := map[string]interface{}{}
	errUnmarshal := json.Unmarshal([]byte(args.W文件内容), &文件内容字典)
	if errUnmarshal != nil {
		return errorx.New(errUnmarshal.Error())
	}
	文件内容, errMarshalIndent := json.MarshalIndent(文件内容字典, "", "\t")
	if errMarshalIndent != nil {
		return errorx.New(errMarshalIndent.Error())
	}
	result.X新文件路径, err = sr.File.NewFile(args.W文件路径, args.W文件类型, args.W文件名, string(文件内容))
	return
}

func (this *Http) Y移动文件(ctx context.Context, args *Y移动文件, result *Y移动文件响应) (err error) {
	result1, moveerr := sr.File.MoveFile(args.Y源路径, args.X新路径)
	if moveerr != nil {
		return
	}
	jsonstr, _ := json.Marshal(result1)
	result.M移动文件对 = string(jsonstr)
	return
}

func (this *Http) S删除文件(ctx context.Context, args *S删除文件) (err error) {
	if args.W文件路径 == "" {
		return errorx.New("参数非法: 文件路径 不能为空")
	}
	return sr.File.DeleteFile(args.W文件路径)
}

func (this *Http) C重命名文件(ctx context.Context, args *C重命名文件, result *Y移动文件响应) (err error) {
	if args.X新路径 == "" {
		return errorx.New("参数非法: 新路径不能为空")
	}
	name := filepathx.Name(args.X新路径)
	if name == "" {
		return errorx.New("参数非法: 文件名不能为空")
	}
	if args.Y源路径 == args.X新路径 {
		return errorx.New("参数非法: 源路径与新路径相等")
	}
	moveerr := sr.File.Rename(args.Y源路径, args.X新路径)
	if moveerr != nil {
		return moveerr
	}
	return
}
func (this *Http) S刷新资源文件(ctx context.Context, args *S刷新资源文件参数) (err error) {
	err = sr.Config.Do更新资源文件夹()
	if err != nil {
		return errorx.Wrap(err, "更新资源文件夹")
	}

	return
}

func (this *Http) B保存配置(ctx context.Context, args *B保存配置) (err error) {

	if args.N内容 == "" {
		return nil
	}
	filemaps := map[string]interface{}{}
	errUnmarshal := json.Unmarshal([]byte(args.N内容), &filemaps)
	if errUnmarshal != nil {
		return errorx.Wrap(errUnmarshal, fmt.Sprintf("json.Unmarshal"))
	}

	for key, val := range filemaps {
		content, jsonerr := json.MarshalIndent(val, "", "\t")
		if jsonerr != nil {
			return errorx.Wrap(jsonerr, fmt.Sprintf("编码"))
		}
		err = sr.File.SaveFile(key, string(content))
		if err != nil {
			return err
		}
	}
	return nil
}
func (this *Http) F发布配置(ctx context.Context, args *F发布配置) (err error) {
	return sr.File.Publish()
}

func (this *Http) G更新帧动画(ctx context.Context, args *G更新帧动画) (err error) {
	if args.P配置 == "" {
		return nil
	}

	m := map[string]interface{}{}
	errJson := json.Unmarshal([]byte(args.P配置), &m)
	if errJson != nil {
		return errJson
	}

	return models.Module.G更新帧动画(m)
}

func (this *Http) S使用VSCode打开(ctx context.Context, args *S使用VSCode打开参数) (err error) {
	if args.W文件路径 == "" {
		return errorx.New("文件路径不能为空")
	}
	err = OpenVSCode(YamlLocal.X项目路径)
	if err != nil {
		return err
	}
	文件路径 := models.Module.Get资源路径() + "/" + args.W文件路径
	return OpenVSCode(文件路径)
}

func OpenVSCode(file string) error {

	var cmd *exec.Cmd

	switch runtime.GOOS {
	case "windows":
		cmd = exec.Command("code", "-r", file)
	case "darwin":
		cmd = exec.Command("open", "-a", "Visual Studio Code", "-r", file)
	default:
		cmd = exec.Command("code", "-r", file)
	}

	// 不绑定 Stdout / Stderr，避免输出
	return cmd.Start() // 用 Start() 不会阻塞，Run() 会阻塞直到退出
}
